這個東西搜尋一下會發現有很多種叫法,深度緩衝、Z緩衝、depth buffer、z-buffer,都是指同一件東西。
先給各位看一張圖:
from wiki
有些讀者或許看過這張圖,這張圖就是把深度緩衝的值取出來,當作顏色繪製的結果,顏色越黑表示越靠近相機,越白則離相機越遠。
在Day4介紹幾何階段的時候,有介紹到深度緩衝,在這邊以我理解的方式解詳細一點,以下將深度緩衝的實作步驟列出來:
例如:當前表格的數字是1,碰到了一個片段,它的深度值為0.8,且設定為「若比表中原有的值小則更新」,0.8 < 1,所以更新表格。
以下這張圖作為輔助,希望讀者可以比較清楚上面的步驟再說甚麼:
from 【3D】深度測試與 Z fighting
此為上面步驟五的的範例中提到的「設定」
在介紹渲染管線的時候,說過有些階段開發者只能對他設定一些功能,深度緩衝就是如此。
我們必須把繪製設定寫在Unity Shader這個地方:
...
SubShader {
Pass {
// 繪製設定寫在這裡!
ZWrite On
ZTest Less
CGPROGRAM
...
ENDCG
}
}
...
關於深度緩衝的操作有這兩種
深度寫入表示是否開啟測試,狀態就最簡單只有開啟(On)跟關閉(Off)而已,深度測試的後面則表示通過測試的比較方法,分別有:
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
例如:ZTest Less
會去比較深度緩衝內,新的數值有沒有小於已填入的數值,有的話則更新成新數值。
ZTest Always
等同於 ZWrite Off
,表示不論如何都通過。
除了本篇的深度測試以及寫入,還有混合效果(Blend)跟剔除(Cull),之後也會介紹這兩個設定會用在哪裡。
Buffer,或是中文譯作緩衝,這個詞在我剛踏入軟體領域的時候讓我疑惑。根據我淺薄的電子學知識,我所認識Buffer是這個:
from wiki
於是我找到了這篇stackoverflow問答的第二個答案,一句話說明了Buffer的作用,下面的一句話我按照原意,添加了一些東西,若讀者認為有誤也請給予批評:
是一個用來暫存資料(訊號)的地方,為了要防止輸入與輸出之間不同的頻率及速度
將兩個正方體重疊,然後由相機俯視他們的重疊面,就會看到以下這個現象,這現象就是所謂的Z-fighting,原因在於深度緩衝的精度不夠,無法正確辨識誰在前或誰在後,目前我知道有兩種解決這個現象的方法: